package com.xxxtea.service;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.xxxtea.entity.Order;
import com.xxxtea.entity.OrderItem;
import com.xxxtea.mapper.OrderMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 订单服务类
 * 
 * 负责订单相关的业务逻辑处理，包括：
 * - 订单信息的查询和管理
 * - 生成支付二维码URL
 * - 为订单设置订单项信息
 * 
 * @author badman
 * @since 1.0.0
 */
@Slf4j
@Service
public class OrderService extends BaseService<OrderMapper, Order> {
	
	/**
	 * 订单项服务，用于查询订单项信息
	 */
	@Resource
	private OrderItemService orderItemService;

	/**
	 * 为订单生成支付二维码URL
	 * 
	 * 根据服务器配置生成完整的支付二维码访问地址
	 * 
	 * @param order 订单对象
	 */
	public void createPayCode(Order order) {
		// 获取服务器主机地址
		String host = SpringUtil.getProperty("server.host");
		// 获取服务器端口
		String port = SpringUtil.getProperty("server.port");
		// 生成支付二维码的完整URL
		String url = StrUtil.format("http://{}:{}/api/order/qrCode/{}", host, port, order.getId());
		// 设置订单的支付二维码URL
		order.setPayCodeUrl(url);
	}

	/**
	 * 为订单列表设置订单项信息
	 * 
	 * 批量查询订单项并关联到对应的订单中，提高查询效率
	 * 
	 * @param orders 订单列表
	 */
	public void setOrderItems(List<Order> orders) {
		// 检查订单列表是否为空
		if (CollUtil.isEmpty(orders)) {
			return;
		}
		
		// 提取所有订单ID
		List<Integer> ids = orders.stream().map(Order::getId).collect(Collectors.toList());
		
		// 批量查询所有订单项，并按订单ID分组
		Map<Integer, List<OrderItem>> map = orderItemService.lambdaQuery()
				.in(OrderItem::getOrderId, ids).list()
				.stream().collect(Collectors.groupingBy(OrderItem::getOrderId));

		// 为每个订单设置对应的订单项
		for (Order order : orders) {
			List<OrderItem> orderItems = map.get(order.getId());
			order.setOrderItems(orderItems);
		}
	}

}